package uloha1;

import java.util.Arrays;
import java.util.HashMap;

public class Batoh {

    HashMap<Integer, VecDoBatohu> zoznamVeci;
    int pocetVeciVbatohu;
    int citac;
    int maxHmotnost;
    double dosavadnaMaxCena;
    String citacBinarny;
    int[] poleKonfiguracie;
    int[] konfiguraciaSmaxHodnotou;
    int cisloInstancie;

    public Batoh(int maxHmotnost, int pocetVeciVbatohu,int cisloInstancie) {
        this.maxHmotnost = maxHmotnost;
        this.pocetVeciVbatohu = pocetVeciVbatohu;
        this.cisloInstancie = cisloInstancie ;
        
        zoznamVeci = new HashMap<Integer, VecDoBatohu>();
        citacBinarny = new String("");

        poleKonfiguracie = new int[pocetVeciVbatohu];
        konfiguraciaSmaxHodnotou = new int[pocetVeciVbatohu];

        citac = 0;
        dosavadnaMaxCena = 0;
    }

    public void pridajVecDoBatohu(Integer index, VecDoBatohu vec) {
        zoznamVeci.put(index, vec);
    }

    void vyriesProblemAvypisRiesenie() { //prechadza vsetky ohodnotenia konfiguracnych premennych

        citac = 0;
        dosavadnaMaxCena = 0;

        int[] tempPole = new int[pocetVeciVbatohu];

        for (int kombinaciaVeci = 0; kombinaciaVeci < Math.pow(2,pocetVeciVbatohu); kombinaciaVeci++, citac++) { // pre 4 veci 16* prebehne cytklus
            //System.out.println("Aktualny priechod "+ kombinaciaVeci);
            citacBinarny = Integer.toBinaryString(citac);
            //System.out.println("");
           // System.out.println("********************************************************");

           // System.out.println("Binarny citac ma hodnotu " + citacBinarny);
            Arrays.fill(poleKonfiguracie, 0);
            int pocitadlo = 0;
            for (int i = pocetVeciVbatohu - citacBinarny.length(); i < pocetVeciVbatohu; i++, pocitadlo++) {
                tempPole[i] = (Integer.valueOf(citacBinarny.charAt(pocitadlo))) - 48;
            } //doplnenie nevyznamovych nul
            
            for (int i = 0; i < tempPole.length; i++) {
                poleKonfiguracie[i] = tempPole[i];
            }//pole konfig obsahuje citac v binare
            boolean jeLepsieMax = skontrolujPodmienku(poleKonfiguracie);

            if (jeLepsieMax) {
                double sumaCeny = 0;
                for (int i = 0; i < poleKonfiguracie.length; i++) {
                    sumaCeny += poleKonfiguracie[i] * (((VecDoBatohu) zoznamVeci.get(i + 1)).cenaVeci);
                    }
                
               //System.out.println("Aktualna cena tejto konfiguracie je " + sumaCeny + " pricom max Aktualna cena je zatial pred vyhodnotenim" + dosavadnaMaxCena);
                if (sumaCeny > dosavadnaMaxCena) {
                    dosavadnaMaxCena = sumaCeny;
                    for (int i = 0; i < poleKonfiguracie.length; i++) {
                        konfiguraciaSmaxHodnotou[i] = poleKonfiguracie[i];
                    }
                //System.out.print("Aktualna najlepsia cena je " + dosavadnaMaxCena + " a dosahuje ju tato konfiguracia : ");
                    for (int i = 0; i < konfiguraciaSmaxHodnotou.length; i++) {
                        //System.out.print(konfiguraciaSmaxHodnotou[i]);
                    }
                }
            }
        } // pre vsetky konfiguracie sme vyriesili batoh, nasleduje vyber najlepsej moznosti

        // vypise najlepsiu hodnotu
       // System.out.println("");
        //System.out.print("Najlepsia konfiguracia je ");
        System.out.print(cisloInstancie + " " + zoznamVeci.size() + " " + (int)dosavadnaMaxCena + " ");
        for (int i = 0; i < konfiguraciaSmaxHodnotou.length; i++) {
            System.out.print(konfiguraciaSmaxHodnotou[i] + " " );
        }
        System.out.print("\n");
    }

    public boolean skontrolujPodmienku(int[] konfiguracia) {
        double sumaHmotnosti = 0;
        for (int i = 0; i < konfiguracia.length; i++) {
            sumaHmotnosti += konfiguracia[i] * (((VecDoBatohu) zoznamVeci.get(i + 1)).hmotnostVeci);
            //System.out.println("Suma hmotnosti je teraz " + sumaHmotnosti);
        }
        if (sumaHmotnosti <= maxHmotnost) {
           // System.out.println("Podmienka splnena");
            return true;
            
        } else {
             //System.out.println("a dosahuje ju tato konfiguracia : ");
                           // for (int i = 0; i < konfiguraciaSmaxHodnotou.length; i++) {
                            //    System.out.print(konfiguraciaSmaxHodnotou[i]);
                        }
            //System.out.println("Podmienka nesplnena");
            return false;
        }
    }

